home *** CD-ROM | disk | FTP | other *** search
/ Turnbull China Bikeride / Turnbull China Bikeride - Disc 2.iso / STUTTGART / FROMUTS / CDUNGEON / !CDUNGEON / c / DVERB2 < prev    next >
Text File  |  1992-03-25  |  17KB  |  695 lines

  1. /* SAVE- SAVE GAME STATE */
  2.  
  3. /*COPYRIGHT 1980, INFOCOM COMPUTERS AND COMMUNICATIONS, CAMBRIDGE MA. 02142*/
  4. /* ALL RIGHTS RESERVED, COMMERCIAL USAGE STRICTLY PROHIBITED */
  5. /* WRITTEN BY R. M. SUPNIK */
  6.  
  7. #include <stdio.h>
  8. #include "funcs.h"
  9. #include "vars.h"
  10.  
  11. /* DECLARATIONS */
  12.  
  13. static integer cxappl_ P((integer));
  14.  
  15. void savegm_()
  16. {
  17.     /* Local variables */
  18.     integer i;
  19.     FILE *e;
  20.  
  21.     prsvec_1.prswon = FALSE_;
  22. /*                         !DISABLE GAME. */
  23. /* Note: save file format is different for PDP vs. non-PDP versions */
  24.  
  25.     if ((e = fopen("dsave.dat", BINWRITE)) == NULL)
  26.     goto L100;
  27.  
  28.     gttime_(&i);
  29. /*                         !GET TIME. */
  30.  
  31. #define do_uio(i, zbuf, cbytes) \
  32.     (void) fwrite((const char *)(zbuf), (cbytes), (i), e)
  33.  
  34.     do_uio(1, &vers_1.vmaj, sizeof(integer));
  35.     do_uio(1, &vers_1.vmin, sizeof(integer));
  36.     do_uio(1, &vers_1.vedit, sizeof(integer));
  37.  
  38.     do_uio(1, &play_1.winner, sizeof(integer));
  39.     do_uio(1, &play_1.here, sizeof(integer));
  40.     do_uio(1, &hack_1.thfpos, sizeof(integer));
  41.     do_uio(1, &play_1.telflg, sizeof(logical));
  42.     do_uio(1, &hack_1.thfflg, sizeof(logical));
  43.     do_uio(1, &hack_1.thfact, sizeof(logical));
  44.     do_uio(1, &hack_1.swdact, sizeof(logical));
  45.     do_uio(1, &hack_1.swdsta, sizeof(integer));
  46.     do_uio(64, &puzzle_1.cpvec[0], sizeof(integer));
  47.  
  48.     do_uio(1, &i, sizeof(integer));
  49.     do_uio(1, &state_1.moves, sizeof(integer));
  50.     do_uio(1, &state_1.deaths, sizeof(integer));
  51.     do_uio(1, &state_1.rwscor, sizeof(integer));
  52.     do_uio(1, &state_1.egscor, sizeof(integer));
  53.     do_uio(1, &state_1.mxload, sizeof(integer));
  54.     do_uio(1, &state_1.ltshft, sizeof(integer));
  55.     do_uio(1, &state_1.bloc, sizeof(integer));
  56.     do_uio(1, &state_1.mungrm, sizeof(integer));
  57.     do_uio(1, &state_1.hs, sizeof(integer));
  58.     do_uio(1, &screen_1.fromdr, sizeof(integer));
  59.     do_uio(1, &screen_1.scolrm, sizeof(integer));
  60.     do_uio(1, &screen_1.scolac, sizeof(integer));
  61.  
  62.     do_uio(220, &objcts_1.odesc1[0], sizeof(integer));
  63.     do_uio(220, &objcts_1.odesc2[0], sizeof(integer));
  64.     do_uio(220, &objcts_1.oflag1[0], sizeof(integer));
  65.     do_uio(220, &objcts_1.oflag2[0], sizeof(integer));
  66.     do_uio(220, &objcts_1.ofval[0], sizeof(integer));
  67.     do_uio(220, &objcts_1.otval[0], sizeof(integer));
  68.     do_uio(220, &objcts_1.osize[0], sizeof(integer));
  69.     do_uio(220, &objcts_1.ocapac[0], sizeof(integer));
  70.     do_uio(220, &objcts_1.oroom[0], sizeof(integer));
  71.     do_uio(220, &objcts_1.oadv[0], sizeof(integer));
  72.     do_uio(220, &objcts_1.ocan[0], sizeof(integer));
  73.  
  74.     do_uio(200, &rooms_1.rval[0], sizeof(integer));
  75.     do_uio(200, &rooms_1.rflag[0], sizeof(integer));
  76.     /* ILT 11/20/91 Save the ractio array as well, since otherwise
  77.        a change to rrand can confuse the restored game.  */
  78.     do_uio(200, &rooms_1.ractio[0], sizeof(integer));
  79.  
  80.     do_uio(4, &advs_1.aroom[0], sizeof(integer));
  81.     do_uio(4, &advs_1.ascore[0], sizeof(integer));
  82.     do_uio(4, &advs_1.avehic[0], sizeof(integer));
  83.     do_uio(4, &advs_1.astren[0], sizeof(integer));
  84.     do_uio(4, &advs_1.aflag[0], sizeof(integer));
  85.  
  86.     do_uio(46, &flags[0], sizeof(logical));
  87.     do_uio(22, &switch_[0], sizeof(integer));
  88.     do_uio(4, &vill_1.vprob[0], sizeof(integer));
  89.     do_uio(25, &cevent_1.cflag[0], sizeof(logical));
  90.     do_uio(25, &cevent_1.ctick[0], sizeof(integer));
  91.  
  92. #undef do_uio
  93.  
  94.     if (fclose(e) == EOF)
  95.     goto L100;
  96.  
  97.     rspeak_(597);
  98.     return;
  99.  
  100. L100:
  101.     rspeak_(598);
  102. /*                         !CANT DO IT. */
  103. } /* savegm_ */
  104.  
  105. /* RESTORE- RESTORE GAME STATE */
  106.  
  107. /* DECLARATIONS */
  108.  
  109. void rstrgm_()
  110. {
  111.     /* Local variables */
  112.     integer i, j, k;
  113.     FILE *e;
  114.  
  115.     prsvec_1.prswon = FALSE_;
  116. /*                         !DISABLE GAME. */
  117. /* Note: save file format is different for PDP vs. non-PDP versions */
  118.  
  119.     if ((e = fopen("dsave.dat", BINREAD)) == NULL)
  120.     goto L100;
  121.  
  122. #define do_uio(i, zbuf, cbytes) \
  123.     (void)fread((char *)(zbuf), (cbytes), (i), e)
  124.  
  125.     do_uio(1, &i, sizeof(integer));
  126.     do_uio(1, &j, sizeof(integer));
  127.     do_uio(1, &k, sizeof(integer));
  128.  
  129.     if (i != vers_1.vmaj | j != vers_1.vmin) {
  130.     goto L200;
  131.     }
  132.  
  133.     do_uio(1, &play_1.winner, sizeof(integer));
  134.     do_uio(1, &play_1.here, sizeof(integer));
  135.     do_uio(1, &hack_1.thfpos, sizeof(integer));
  136.     do_uio(1, &play_1.telflg, sizeof(logical));
  137.     do_uio(1, &hack_1.thfflg, sizeof(logical));
  138.     do_uio(1, &hack_1.thfact, sizeof(logical));
  139.     do_uio(1, &hack_1.swdact, sizeof(logical));
  140.     do_uio(1, &hack_1.swdsta, sizeof(integer));
  141.     do_uio(64, &puzzle_1.cpvec[0], sizeof(integer));
  142.  
  143.     do_uio(1, &time_1.pltime, sizeof(integer));
  144.     do_uio(1, &state_1.moves, sizeof(integer));
  145.     do_uio(1, &state_1.deaths, sizeof(integer));
  146.     do_uio(1, &state_1.rwscor, sizeof(integer));
  147.     do_uio(1, &state_1.egscor, sizeof(integer));
  148.     do_uio(1, &state_1.mxload, sizeof(integer));
  149.     do_uio(1, &state_1.ltshft, sizeof(integer));
  150.     do_uio(1, &state_1.bloc, sizeof(integer));
  151.     do_uio(1, &state_1.mungrm, sizeof(integer));
  152.     do_uio(1, &state_1.hs, sizeof(integer));
  153.     do_uio(1, &screen_1.fromdr, sizeof(integer));
  154.     do_uio(1, &screen_1.scolrm, sizeof(integer));
  155.     do_uio(1, &screen_1.scolac, sizeof(integer));
  156.  
  157.     do_uio(220, &objcts_1.odesc1[0], sizeof(integer));
  158.     do_uio(220, &objcts_1.odesc2[0], sizeof(integer));
  159.     do_uio(220, &objcts_1.oflag1[0], sizeof(integer));
  160.     do_uio(220, &objcts_1.oflag2[0], sizeof(integer));
  161.     do_uio(220, &objcts_1.ofval[0], sizeof(integer));
  162.     do_uio(220, &objcts_1.otval[0], sizeof(integer));
  163.     do_uio(220, &objcts_1.osize[0], sizeof(integer));
  164.     do_uio(220, &objcts_1.ocapac[0], sizeof(integer));
  165.     do_uio(220, &objcts_1.oroom[0], sizeof(integer));
  166.     do_uio(220, &objcts_1.oadv[0], sizeof(integer));
  167.     do_uio(220, &objcts_1.ocan[0], sizeof(integer));
  168.  
  169.     do_uio(200, &rooms_1.rval[0], sizeof(integer));
  170.     do_uio(200, &rooms_1.rflag[0], sizeof(integer));
  171.     /* ILT 11/20/91 If this is 2.7B, the ractio array was also saved.  */
  172.     if (k != 'A')
  173.       do_uio(200, &rooms_1.ractio[0], sizeof(integer));
  174.  
  175.     do_uio(4, &advs_1.aroom[0], sizeof(integer));
  176.     do_uio(4, &advs_1.ascore[0], sizeof(integer));
  177.     do_uio(4, &advs_1.avehic[0], sizeof(integer));
  178.     do_uio(4, &advs_1.astren[0], sizeof(integer));
  179.     do_uio(4, &advs_1.aflag[0], sizeof(integer));
  180.  
  181.     do_uio(46, &flags[0], sizeof(logical));
  182.     do_uio(22, &switch_[0], sizeof(integer));
  183.     do_uio(4, &vill_1.vprob[0], sizeof(integer));
  184.     do_uio(25, &cevent_1.cflag[0], sizeof(logical));
  185.     do_uio(25, &cevent_1.ctick[0], sizeof(integer));
  186.  
  187.     (void)fclose(e);
  188.  
  189.     rspeak_(599);
  190.     return;
  191.  
  192. L100:
  193.     rspeak_(598);
  194. /*                         !CANT DO IT. */
  195.     return;
  196.  
  197. L200:
  198.     rspeak_(600);
  199. /*                         !OBSOLETE VERSION */
  200.     (void)fclose(e);
  201. } /* rstrgm_ */
  202.  
  203. /* WALK- MOVE IN SPECIFIED DIRECTION */
  204.  
  205. /* DECLARATIONS */
  206.  
  207. logical walk_()
  208. {
  209.     /* System generated locals */
  210.     logical ret_val;
  211.  
  212.     ret_val = TRUE_;
  213. /*                         !ASSUME WINS. */
  214.     if (play_1.winner != aindex_1.player || lit_(play_1.here) || prob_(25,
  215.         25)) {
  216.     goto L500;
  217.     }
  218.     if (! findxt_(prsvec_1.prso, play_1.here)) {
  219.     goto L450;
  220.     }
  221. /*                         !INVALID EXIT? GRUE */
  222. /*                         ! */
  223.     switch (curxt_1.xtype) {
  224.     case 1:  goto L400;
  225.     case 2:  goto L200;
  226.     case 3:  goto L100;
  227.     case 4:  goto L300;
  228.     }
  229. /*                         !DECODE EXIT TYPE. */
  230.     bug_(9, curxt_1.xtype);
  231.  
  232. L100:
  233.     if (cxappl_(curxt_1.xactio) != 0) {
  234.     goto L400;
  235.     }
  236. /*                         !CEXIT... RETURNED ROOM? */
  237.     if (flags[*xflag - 1]) {
  238.     goto L400;
  239.     }
  240. /*                         !NO, FLAG ON? */
  241. L200:
  242.     jigsup_(523);
  243. /*                         !BAD EXIT, GRUE */
  244. /*                         ! */
  245.     return ret_val;
  246.  
  247. L300:
  248.     if (cxappl_(curxt_1.xactio) != 0) {
  249.     goto L400;
  250.     }
  251. /*                         !DOOR... RETURNED ROOM? */
  252.     if ((objcts_1.oflag2[curxt_1.xobj - 1] & OPENBT) != 0) {
  253.     goto L400;
  254.     }
  255. /*                         !NO, DOOR OPEN? */
  256.     jigsup_(523);
  257. /*                         !BAD EXIT, GRUE */
  258. /*                         ! */
  259.     return ret_val;
  260.  
  261. L400:
  262.     if (lit_(curxt_1.xroom1)) {
  263.     goto L900;
  264.     }
  265. /*                         !VALID ROOM, IS IT LIT? */
  266. L450:
  267.     jigsup_(522);
  268. /*                         !NO, GRUE */
  269. /*                         ! */
  270.     return ret_val;
  271.  
  272. /* ROOM IS LIT, OR WINNER IS NOT PLAYER (NO GRUE). */
  273.  
  274. L500:
  275.     if (findxt_(prsvec_1.prso, play_1.here)) {
  276.     goto L550;
  277.     }
  278. /*                         !EXIT EXIST? */
  279. L525:
  280.     curxt_1.xstrng = 678;
  281. /*                         !ASSUME WALL. */
  282.     if (prsvec_1.prso == xsrch_1.xup) {
  283.     curxt_1.xstrng = 679;
  284.     }
  285. /*                         !IF UP, CANT. */
  286.     if (prsvec_1.prso == xsrch_1.xdown) {
  287.     curxt_1.xstrng = 680;
  288.     }
  289. /*                         !IF DOWN, CANT. */
  290.     if ((rooms_1.rflag[play_1.here - 1] & RNWALL) != 0) {
  291.     curxt_1.xstrng = 524;
  292.     }
  293.     rspeak_(curxt_1.xstrng);
  294.     prsvec_1.prscon = 1;
  295. /*                         !STOP CMD STREAM. */
  296.     return ret_val;
  297.  
  298. L550:
  299.     switch (curxt_1.xtype) {
  300.     case 1:  goto L900;
  301.     case 2:  goto L600;
  302.     case 3:  goto L700;
  303.     case 4:  goto L800;
  304.     }
  305. /*                         !BRANCH ON EXIT TYPE. */
  306.     bug_(9, curxt_1.xtype);
  307.  
  308. L700:
  309.     if (cxappl_(curxt_1.xactio) != 0) {
  310.     goto L900;
  311.     }
  312. /*                         !CEXIT... RETURNED ROOM? */
  313.     if (flags[*xflag - 1]) {
  314.     goto L900;
  315.     }
  316. /*                         !NO, FLAG ON? */
  317. L600:
  318.     if (curxt_1.xstrng == 0) {
  319.     goto L525;
  320.     }
  321. /*                         !IF NO REASON, USE STD. */
  322.     rspeak_(curxt_1.xstrng);
  323. /*                         !DENY EXIT. */
  324.     prsvec_1.prscon = 1;
  325. /*                         !STOP CMD STREAM. */
  326.     return ret_val;
  327.  
  328. L800:
  329.     if (cxappl_(curxt_1.xactio) != 0) {
  330.     goto L900;
  331.     }
  332. /*                         !DOOR... RETURNED ROOM? */
  333.     if ((objcts_1.oflag2[curxt_1.xobj - 1] & OPENBT) != 0) {
  334.     goto L900;
  335.     }
  336. /*                         !NO, DOOR OPEN? */
  337.     if (curxt_1.xstrng == 0) {
  338.     curxt_1.xstrng = 525;
  339.     }
  340. /*                         !IF NO REASON, USE STD. */
  341.     rspsub_(curxt_1.xstrng, objcts_1.odesc2[curxt_1.xobj - 1]);
  342.     prsvec_1.prscon = 1;
  343. /*                         !STOP CMD STREAM. */
  344.     return ret_val;
  345.  
  346. L900:
  347.     ret_val = moveto_(curxt_1.xroom1, play_1.winner);
  348. /*                         !MOVE TO ROOM. */
  349.     if (ret_val) {
  350.     ret_val = rmdesc_(0);
  351.     }
  352. /*                         !DESCRIBE ROOM. */
  353.     return ret_val;
  354. } /* walk_ */
  355.  
  356. /* CXAPPL- CONDITIONAL EXIT PROCESSORS */
  357.  
  358. /* DECLARATIONS */
  359.  
  360. static integer cxappl_(ri)
  361. integer ri;
  362. {
  363.     /* System generated locals */
  364.     integer ret_val, i__1;
  365.  
  366.     /* Local variables */
  367.     integer i, j, k;
  368.     integer nxt;
  369.     integer ldir;
  370.  
  371.     ret_val = 0;
  372. /*                         !NO RETURN. */
  373.     if (ri == 0) {
  374.     return ret_val;
  375.     }
  376. /*                         !IF NO ACTION, DONE. */
  377.     switch (ri) {
  378.     case 1:  goto L1000;
  379.     case 2:  goto L2000;
  380.     case 3:  goto L3000;
  381.     case 4:  goto L4000;
  382.     case 5:  goto L5000;
  383.     case 6:  goto L6000;
  384.     case 7:  goto L7000;
  385.     case 8:  goto L8000;
  386.     case 9:  goto L9000;
  387.     case 10:  goto L10000;
  388.     case 11:  goto L11000;
  389.     case 12:  goto L12000;
  390.     case 13:  goto L13000;
  391.     case 14:  goto L14000;
  392.     }
  393.     bug_(5, ri);
  394.  
  395. /* C1- COFFIN-CURE */
  396.  
  397. L1000:
  398.     findex_1.egyptf = objcts_1.oadv[oindex_1.coffi - 1] != play_1.winner;
  399. /*                         !T IF NO COFFIN. */
  400.     return ret_val;
  401.  
  402. /* C2- CAROUSEL EXIT */
  403. /* C5- CAROUSEL OUT */
  404.  
  405. L2000:
  406.     if (findex_1.caroff) {
  407.     return ret_val;
  408.     }
  409. /*                         !IF FLIPPED, NOTHING. */
  410. L2500:
  411.     rspeak_(121);
  412. /*                         !SPIN THE COMPASS. */
  413. L5000:
  414.     i = xpars_1.xelnt[xpars_1.xcond - 1] * rnd_(8);
  415. /*                         !CHOOSE RANDOM EXIT. */
  416.     curxt_1.xroom1 = exits_1.travel[rooms_1.rexit[play_1.here - 1] + i - 1] & 
  417.         xpars_1.xrmask;
  418.     ret_val = curxt_1.xroom1;
  419. /*                         !RETURN EXIT. */
  420.     return ret_val;
  421.  
  422. /* C3- CHIMNEY FUNCTION */
  423.  
  424. L3000:
  425.     findex_1.litldf = FALSE_;
  426. /*                         !ASSUME HEAVY LOAD. */
  427.     j = 0;
  428.     i__1 = objcts_1.olnt;
  429.     for (i = 1; i <= i__1; ++i) {
  430. /*                         !COUNT OBJECTS. */
  431.     if (objcts_1.oadv[i - 1] == play_1.winner) {
  432.         ++j;
  433.     }
  434. /* L3100: */
  435.     }
  436.  
  437.     if (j > 2) {
  438.     return ret_val;
  439.     }
  440. /*                         !CARRYING TOO MUCH? */
  441.     curxt_1.xstrng = 446;
  442. /*                         !ASSUME NO LAMP. */
  443.     if (objcts_1.oadv[oindex_1.lamp - 1] != play_1.winner) {
  444.     return ret_val;
  445.     }
  446. /*                         !NO LAMP? */
  447.     findex_1.litldf = TRUE_;
  448. /*                         !HE CAN DO IT. */
  449.     if ((objcts_1.oflag2[oindex_1.door - 1] & OPENBT) == 0) {
  450.     objcts_1.oflag2[oindex_1.door - 1] &= ~ TCHBT;
  451.     }
  452.     return ret_val;
  453.  
  454. /* C4-    FROBOZZ FLAG (MAGNET ROOM, FAKE EXIT) */
  455. /* C6-    FROBOZZ FLAG (MAGNET ROOM, REAL EXIT) */
  456.  
  457. L4000:
  458.     if (findex_1.caroff) {
  459.     goto L2500;
  460.     }
  461. /*                         !IF FLIPPED, GO SPIN. */
  462.     findex_1.frobzf = FALSE_;
  463. /*                         !OTHERWISE, NOT AN EXIT. */
  464.     return ret_val;
  465.  
  466. L6000:
  467.     if (findex_1.caroff) {
  468.     goto L2500;
  469.     }
  470. /*                         !IF FLIPPED, GO SPIN. */
  471.     findex_1.frobzf = TRUE_;
  472. /*                         !OTHERWISE, AN EXIT. */
  473.     return ret_val;
  474.  
  475. /* C7-    FROBOZZ FLAG (BANK ALARM) */
  476.  
  477. L7000:
  478.     findex_1.frobzf = objcts_1.oroom[oindex_1.bills - 1] != 0 & 
  479.         objcts_1.oroom[oindex_1.portr - 1] != 0;
  480.     return ret_val;
  481. /* CXAPPL, PAGE 3 */
  482.  
  483. /* C8-    FROBOZZ FLAG (MRGO) */
  484.  
  485. L8000:
  486.     findex_1.frobzf = FALSE_;
  487. /*                         !ASSUME CANT MOVE. */
  488.     if (findex_1.mloc != curxt_1.xroom1) {
  489.     goto L8100;
  490.     }
  491. /*                         !MIRROR IN WAY? */
  492.     if (prsvec_1.prso == xsrch_1.xnorth || prsvec_1.prso == xsrch_1.xsouth) {
  493.     goto L8200;
  494.     }
  495.     if (findex_1.mdir % 180 != 0) {
  496.     goto L8300;
  497.     }
  498. /*                         !MIRROR MUST BE N-S. */
  499.     curxt_1.xroom1 = (curxt_1.xroom1 - rindex_1.mra << 1) + rindex_1.mrae;
  500. /*                         !CALC EAST ROOM. */
  501.     if (prsvec_1.prso > xsrch_1.xsouth) {
  502.     ++curxt_1.xroom1;
  503.     }
  504. /*                         !IF SW/NW, CALC WEST. */
  505. L8100:
  506.     ret_val = curxt_1.xroom1;
  507.     return ret_val;
  508.  
  509. L8200:
  510.     curxt_1.xstrng = 814;
  511. /*                         !ASSUME STRUC BLOCKS. */
  512.     if (findex_1.mdir % 180 == 0) {
  513.     return ret_val;
  514.     }
  515. /*                         !IF MIRROR N-S, DONE. */
  516. L8300:
  517.     ldir = findex_1.mdir;
  518. /*                         !SEE WHICH MIRROR. */
  519.     if (prsvec_1.prso == xsrch_1.xsouth) {
  520.     ldir = 180;
  521.     }
  522.     curxt_1.xstrng = 815;
  523. /*                         !MIRROR BLOCKS. */
  524.     if (ldir > 180 && ! findex_1.mr1f || ldir < 180 && ! findex_1.mr2f) {
  525.     curxt_1.xstrng = 816;
  526.     }
  527.     return ret_val;
  528.  
  529. /* C9-    FROBOZZ FLAG (MIRIN) */
  530.  
  531. L9000:
  532.     if (mrhere_(play_1.here) != 1) {
  533.     goto L9100;
  534.     }
  535. /*                         !MIRROR 1 HERE? */
  536.     if (findex_1.mr1f) {
  537.     curxt_1.xstrng = 805;
  538.     }
  539. /*                         !SEE IF BROKEN. */
  540.     findex_1.frobzf = findex_1.mropnf;
  541. /*                         !ENTER IF OPEN. */
  542.     return ret_val;
  543.  
  544. L9100:
  545.     findex_1.frobzf = FALSE_;
  546. /*                         !NOT HERE, */
  547.     curxt_1.xstrng = 817;
  548. /*                         !LOSE. */
  549.     return ret_val;
  550. /* CXAPPL, PAGE 4 */
  551.  
  552. /* C10-    FROBOZZ FLAG (MIRROR EXIT) */
  553.  
  554. L10000:
  555.     findex_1.frobzf = FALSE_;
  556. /*                         !ASSUME CANT. */
  557.     ldir = (prsvec_1.prso - xsrch_1.xnorth) / xsrch_1.xnorth * 45;
  558. /*                         !XLATE DIR TO DEGREES. */
  559.     if (! findex_1.mropnf || (findex_1.mdir + 270) % 360 != ldir && 
  560.         prsvec_1.prso != xsrch_1.xexit) {
  561.     goto L10200;
  562.     }
  563.     curxt_1.xroom1 = (findex_1.mloc - rindex_1.mra << 1) + rindex_1.mrae + 1 
  564.         - findex_1.mdir / 180;
  565. /*                         !ASSUME E-W EXIT. */
  566.     if (findex_1.mdir % 180 == 0) {
  567.     goto L10100;
  568.     }
  569. /*                         !IF N-S, OK. */
  570.     curxt_1.xroom1 = findex_1.mloc + 1;
  571. /*                         !ASSUME N EXIT. */
  572.     if (findex_1.mdir > 180) {
  573.     curxt_1.xroom1 = findex_1.mloc - 1;
  574.     }
  575. /*                         !IF SOUTH. */
  576. L10100:
  577.     ret_val = curxt_1.xroom1;
  578.     return ret_val;
  579.  
  580. L10200:
  581.     if (! findex_1.wdopnf || (findex_1.mdir + 180) % 360 != ldir && 
  582.         prsvec_1.prso != xsrch_1.xexit) {
  583.     return ret_val;
  584.     }
  585.     curxt_1.xroom1 = findex_1.mloc + 1;
  586. /*                         !ASSUME N. */
  587.     if (findex_1.mdir == 0) {
  588.     curxt_1.xroom1 = findex_1.mloc - 1;
  589.     }
  590. /*                         !IF S. */
  591.     rspeak_(818);
  592. /*                         !CLOSE DOOR. */
  593.     findex_1.wdopnf = FALSE_;
  594.     ret_val = curxt_1.xroom1;
  595.     return ret_val;
  596.  
  597. /* C11-    MAYBE DOOR.  NORMAL MESSAGE IS THAT DOOR IS CLOSED. */
  598. /*     BUT IF LCELL.NE.4, DOOR ISNT THERE. */
  599.  
  600. L11000:
  601.     if (findex_1.lcell != 4) {
  602.     curxt_1.xstrng = 678;
  603.     }
  604. /*                         !SET UP MSG. */
  605.     return ret_val;
  606.  
  607. /* C12-    FROBZF (PUZZLE ROOM MAIN ENTRANCE) */
  608.  
  609. L12000:
  610.     findex_1.frobzf = TRUE_;
  611. /*                         !ALWAYS ENTER. */
  612.     findex_1.cphere = 10;
  613. /*                         !SET SUBSTATE. */
  614.     return ret_val;
  615.  
  616. /* C13-    CPOUTF (PUZZLE ROOM SIZE ENTRANCE) */
  617.  
  618. L13000:
  619.     findex_1.cphere = 52;
  620. /*                         !SET SUBSTATE. */
  621.     return ret_val;
  622. /* CXAPPL, PAGE 5 */
  623.  
  624. /* C14-    FROBZF (PUZZLE ROOM TRANSITIONS) */
  625.  
  626. L14000:
  627.     findex_1.frobzf = FALSE_;
  628. /*                         !ASSSUME LOSE. */
  629.     if (prsvec_1.prso != xsrch_1.xup) {
  630.     goto L14100;
  631.     }
  632. /*                         !UP? */
  633.     if (findex_1.cphere != 10) {
  634.     return ret_val;
  635.     }
  636. /*                         !AT EXIT? */
  637.     curxt_1.xstrng = 881;
  638. /*                         !ASSUME NO LADDER. */
  639.     if (puzzle_1.cpvec[findex_1.cphere] != -2) {
  640.     return ret_val;
  641.     }
  642. /*                         !LADDER HERE? */
  643.     rspeak_(882);
  644. /*                         !YOU WIN. */
  645.     findex_1.frobzf = TRUE_;
  646. /*                         !LET HIM OUT. */
  647.     return ret_val;
  648.  
  649. L14100:
  650.     if (findex_1.cphere != 52 || prsvec_1.prso != xsrch_1.xwest || ! 
  651.         findex_1.cpoutf) {
  652.     goto L14200;
  653.     }
  654.     findex_1.frobzf = TRUE_;
  655. /*                         !YES, LET HIM OUT. */
  656.     return ret_val;
  657.  
  658. L14200:
  659.     for (i = 1; i <= 16; i += 2) {
  660. /*                         !LOCATE EXIT. */
  661.     if (prsvec_1.prso == puzzle_1.cpdr[i - 1]) {
  662.         goto L14400;
  663.     }
  664. /* L14300: */
  665.     }
  666.     return ret_val;
  667. /*                         !NO SUCH EXIT. */
  668.  
  669. L14400:
  670.     j = puzzle_1.cpdr[i];
  671. /*                         !GET DIRECTIONAL OFFSET. */
  672.     nxt = findex_1.cphere + j;
  673. /*                         !GET NEXT STATE. */
  674.     k = 8;
  675. /*                         !GET ORTHOGONAL DIR. */
  676.     if (j < 0) {
  677.     k = -8;
  678.     }
  679.     if ((abs(j) == 1 || abs(j) == 8 || (puzzle_1.cpvec[findex_1.cphere + k - 
  680.         1] == 0 || puzzle_1.cpvec[nxt - k - 1] == 0)) && puzzle_1.cpvec[
  681.         nxt - 1] == 0) {
  682.     goto L14500;
  683.     }
  684.     return ret_val;
  685.  
  686. L14500:
  687.     cpgoto_(nxt);
  688. /*                         !MOVE TO STATE. */
  689.     curxt_1.xroom1 = rindex_1.cpuzz;
  690. /*                         !STAY IN ROOM. */
  691.     ret_val = curxt_1.xroom1;
  692.     return ret_val;
  693.  
  694. } /* cxappl_ */
  695.